'use strict';

const fs = require('fs');
const path = require('path');
const Sequelize = require('sequelize');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config.json')[env];
const db = {};

/*
自动导入models文件夹下的所有文件，比如users.js这个模型文件
let users = require(./users)
users是一个箭头函数，会执行这个函数，执行函数的时候会传入两个参数，
执行users（）之后会返回一个Users
users（sequelize, DataTypes）= UsersModel 会生成一个Users的模型，
db[UsersModel.name] = UsersModel;等同于下边
db['Users'] = UsersModel
*/

let sequelize;
if (config.use_env_variable) {
  sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
  sequelize = new Sequelize(config.database, config.username, config.password, config);
}

/*
下面通过fs自动加载所有的文件，并执行，
同时生成的模型对象挂载到db对象下面，最终导出
*/

fs
  .readdirSync(__dirname)
  .filter(file => {
    return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js');
  })
  .forEach(file => {
    const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
    db[model.name] = model;
  });

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize; // [] 小写是实例化的对象
db.Sequelize = Sequelize; // Array 大写是构造函数

module.exports = db;
